#include "myid.h"

//#include <iostream>
#include <string.h>
//#include <stdio.h>
//#include <io.h>

#include <fileref.h>
#include <tag.h>
#include <mpegfile.h>
#include <apetag.h>

using namespace std;
using namespace TagLib;

CMyID::CMyID( void )
{
}

CMyID::~CMyID( void )
{
}

void CMyID::Album( char* pszAlbum, const char* pcszSong )
{
	if( pcszSong )
	{
		if( IsApe( pcszSong ) )
		{
			ApeAlbum( pszAlbum, pcszSong );
			return;
		}

		bool butf8 = true;
		TagLib::FileRef file( pcszSong );

		if( !file.isNull() && file.tag() )
		{
			TagLib::String strSong = file.tag()->album();
			if( strSong.isLatin1() || strSong.isAscii() )
			    butf8 = false;

			strcpy( pszAlbum, strSong.toCString( butf8 ) );  //if true, utf8, else latinl
		}
	}
}

void CMyID::ApeAlbum( char* pszAlbum, const char* pcszSong )
{
	if( pcszSong )
	{
		MPEG::File file( pcszSong );
		APE::Tag *ape = file.APETag();

		if(ape)
		{
			for(APE::ItemListMap::ConstIterator it = ape->itemListMap().begin();
						it != ape->itemListMap().end(); ++it)
			{
				const char* pcszAlbum = ( (*it).first ).toCString( true );
				if( strstr( "ALBUM", pcszAlbum ) )
				{
					const char* pcszAlbum = ( (*it).second.toString() ).toCString( true );
					strcpy( pszAlbum, pcszAlbum );
				}
			}
		}
	}
}

bool CMyID::IsApe( const char* pcszApe )
{
    const char* apeList[] = { "ape", "Ape", "aPe", "apE", "APe", "aPE", "ApE", "APE" };
	for( int i=0; i<8; ++i )
	{
		if( strstr( pcszApe, apeList[i] ) )
		    return true;
	}

	return false;
}

